#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int fd[2];
    FILE *f;
    char buf[6]= "hello";

    pipe(fd);
    close(fd[0]);

    signal(SIGPIPE, SIG_IGN);

    if ((f= fdopen(fd[1], "w")) == NULL) {
        perror("fdopen error");
        return 1;
    }
    // fwrite 返回值只表示数据被成功复制到标准 I/O 缓冲区的字节数，并不表示已经成功写入管道。
    size_t n= fwrite(buf, 1, sizeof(buf), f);     
    printf("fwrite returned: %zu\n", n);    // 可能返回成功写入的字节数，但注意这里我们忽略了 SIGPIPE

    // 刷新缓冲区，这里刷新时发生管道破裂，如果前面没有忽略 SIGPIPE，则会收到 SIGPIPE 信号
    if (fflush(f) == EOF) {
        perror("fflush");
        return 1;
    }
    
    fclose(f);
    return 0;
}
